home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / util / cryptography.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  6KB  |  215 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from hashlib import sha1 as _DefaultHash
  5.  
  6. def _key_prep(key, hash = _DefaultHash, length = 16):
  7.     return hash(key).digest()[:length]
  8.  
  9.  
  10. def pad(s, sz, padchar = '\x00'):
  11.     extralen = (sz - len(s) % sz) % sz
  12.     return s + extralen * padchar
  13.  
  14.  
  15. def unpad(s, padchar = '\x00'):
  16.     return s.rstrip(padchar)
  17.  
  18.  
  19. def _encrypt(key, plain, padchar = '\x00'):
  20.     Cipher = AES
  21.     import Crypto.Cipher
  22.     cipher = Cipher.new(key)
  23.     plain = pad(plain, cipher.block_size, padchar)
  24.     return cipher.encrypt(plain)
  25.  
  26.  
  27. def _decrypt(key, crypt, padchar = '\x00'):
  28.     Cipher = AES
  29.     import Crypto.Cipher
  30.     cipher = Cipher.new(key)
  31.     return cipher.decrypt(crypt).rstrip(padchar)
  32.  
  33.  
  34. def cipher_functions(key, padchar = '\x00'):
  35.     
  36.     def _encrypt(plain):
  37.         return encrypt(key, plain, padchar = padchar)
  38.  
  39.     
  40.     def _decrypt(crypt):
  41.         return decrypt(key, crypt, padchar = padchar)
  42.  
  43.     return (_encrypt, _decrypt)
  44.  
  45.  
  46. def hash(s, raw = True, Hash = _DefaultHash):
  47.     if raw:
  48.         
  49.         digest = lambda x: x.digest()
  50.     else:
  51.         
  52.         digest = lambda x: x.hexdigest()
  53.     return digest(Hash(s))
  54.  
  55.  
  56. def encrypt(key, plain, iv = None, padchar = '\x00'):
  57.     if iv is None:
  58.         iv = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  59.     
  60.     mode = 2
  61.     aes = OpenSSL_AES(key, mode, iv)
  62.     plain = pad(plain, aes.block_size, padchar)
  63.     return aes.encrypt(plain)
  64.  
  65.  
  66. def decrypt(key, crypt, iv = None, padchar = '\x00'):
  67.     if iv is None:
  68.         iv = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  69.     
  70.     mode = 2
  71.     aes = OpenSSL_AES(key, mode, iv)
  72.     return unpad(aes.decrypt(crypt), padchar)
  73.  
  74.  
  75. try:
  76.     from M2Crypto import m2
  77. except ImportError:
  78.     has_AES = False
  79.     has_DES3 = False
  80.  
  81. has_AES = True
  82. has_DES3 = True
  83.  
  84. class OpenSSL_AES(object):
  85.     
  86.     def __init__(self, key, mode, IV):
  87.         if len(key) not in (16, 24, 32):
  88.             raise AssertionError()
  89.         
  90.         if mode != 2:
  91.             raise AssertionError()
  92.         
  93.         if len(IV) != 16:
  94.             raise AssertionError()
  95.         
  96.         self.isBlockCipher = True
  97.         self.block_size = 16
  98.         self.implementation = 'openssl'
  99.         if len(key) == 16:
  100.             self.name = 'aes128'
  101.         elif len(key) == 24:
  102.             self.name = 'aes192'
  103.         elif len(key) == 32:
  104.             self.name = 'aes256'
  105.         else:
  106.             raise AssertionError()
  107.         self.key = key
  108.         self.IV = IV
  109.  
  110.     
  111.     def _createContext(self, encrypt):
  112.         context = m2.cipher_ctx_new()
  113.         if len(self.key) == 16:
  114.             cipherType = m2.aes_128_ecb()
  115.         
  116.         if len(self.key) == 24:
  117.             cipherType = m2.aes_192_ecb()
  118.         
  119.         if len(self.key) == 32:
  120.             cipherType = m2.aes_256_ecb()
  121.         
  122.         m2.cipher_init(context, cipherType, self.key, self.IV, encrypt)
  123.         return context
  124.  
  125.     
  126.     def encrypt(self, plaintext):
  127.         if not plaintext:
  128.             return ''
  129.         
  130.         context = self._createContext(1)
  131.         ciphertext = m2.cipher_update(context, plaintext)
  132.         m2.cipher_ctx_free(context)
  133.         self.IV = ciphertext[-(self.block_size):]
  134.         return ciphertext
  135.  
  136.     
  137.     def decrypt(self, ciphertext):
  138.         if not ciphertext:
  139.             return ''
  140.         
  141.         context = self._createContext(0)
  142.         plaintext = m2.cipher_update(context, ciphertext + '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
  143.         plaintext = plaintext[:len(ciphertext)]
  144.         m2.cipher_ctx_free(context)
  145.         self.IV = ciphertext[-(self.block_size):]
  146.         return plaintext
  147.  
  148.  
  149. AES = OpenSSL_AES
  150.  
  151. class OpenSSL_TripleDES(object):
  152.     
  153.     def __init__(self, key, mode, IV):
  154.         if len(key) != 24:
  155.             raise ValueError()
  156.         
  157.         if mode != 2:
  158.             raise ValueError()
  159.         
  160.         if len(IV) != 8:
  161.             raise ValueError()
  162.         
  163.         self.isBlockCipher = True
  164.         self.block_size = 8
  165.         self.implementation = 'openssl'
  166.         self.name = '3des'
  167.         self.key = key
  168.         self.IV = IV
  169.  
  170.     
  171.     def _createContext(self, encrypt):
  172.         context = m2.cipher_ctx_new()
  173.         cipherType = m2.des_ede3_cbc()
  174.         m2.cipher_init(context, cipherType, self.key, self.IV, encrypt)
  175.         return context
  176.  
  177.     
  178.     def encrypt(self, plaintext):
  179.         if not plaintext:
  180.             return ''
  181.         
  182.         context = self._createContext(1)
  183.         ciphertext = m2.cipher_update(context, plaintext)
  184.         m2.cipher_ctx_free(context)
  185.         self.IV = ciphertext[-(self.block_size):]
  186.         return ciphertext
  187.  
  188.     
  189.     def decrypt(self, ciphertext):
  190.         if not ciphertext:
  191.             return ''
  192.         
  193.         context = self._createContext(0)
  194.         plaintext = m2.cipher_update(context, ciphertext + '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
  195.         plaintext = plaintext[:len(ciphertext)]
  196.         m2.cipher_ctx_free(context)
  197.         self.IV = ciphertext[-(self.block_size):]
  198.         return plaintext
  199.  
  200.  
  201. DES3 = OpenSSL_TripleDES
  202.  
  203. def _main():
  204.     key = _key_prep('this is my key')
  205.     plaintext = 'abcd' * 80
  206.     old = encrypt(key, plaintext)
  207.     new = _encrypt(key, plaintext)
  208.     print (old, new), old == new
  209.     print (decrypt(key, new), _decrypt(key, old))
  210.     print 'yay'
  211.  
  212. if __name__ == '__main__':
  213.     _main()
  214.  
  215.